package distributelock;

import java.util.concurrent.locks.Lock;

public class OrderService implements Runnable {
	
	// 定义一个全局的订单号生成器
	private static OrderNoGenerator orderNoGenerator = new OrderNoGenerator();
	// 分布式锁
	private Lock lock = new DistributedLock();
	
	/**
	 * 创建订单号
	 */
	public String getOrderNo() {
		String orderNo = "";
		
		try {
			// 加锁
			lock.lock();
			// 业务处理：生成订单号
			orderNo = orderNoGenerator.getOrderNo();
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			lock.unlock(); // 最后释放锁
		}
		
		return orderNo;
	}

	@Override
	public void run() {
		try {
			String orderNo = getOrderNo();
			System.out.println(Thread.currentThread().getName() + "创建了 orderNo：" + orderNo);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		for (int i=0; i<100; i++) { // 开启100个线程，模拟获取分布式锁场景（需要修改zkClient最大连接数，默认60）
            new Thread(new OrderService()).start();
        }
	}

}
